package com.alan.libapi.api;

import com.alan.libapi.model.business.AppVersionInfo;
import com.alan.libapi.model.business.AreaInfo;
import com.alan.libapi.model.business.BankType;
import com.alan.libapi.model.business.BoundBankCard;
import com.alan.libapi.model.business.MySharedWifiProfit;
import com.alan.libapi.model.business.PaidRecord;
import com.alan.libapi.model.business.ResponsedDevice;
import com.alan.libapi.model.business.ResponsedToken;
import com.alan.libapi.model.business.SharedWifiInfo;
import com.alan.libapi.model.business.UserBoundDevice;
import com.alan.libapi.model.business.UserInfo;
import com.alan.libapi.model.business.UserPackageInfo;
import com.alan.libapi.model.business.UserPackageSituation;
import com.alan.libapi.model.business.UserSession;
import com.alan.libapi.model.business.UserToken;
import com.alan.libapi.model.business.WifiMonthProfit;
import com.alan.libapi.model.persistent.ModifyPwdType;

import java.util.List;

/**
 * @className: ApiHttp
 * @describtion: ApiHttp
 * @author: AlanWang
 * @email: 850267876@qq.com
 * @time: 2016/4/17 18:29
 */
public interface ApiHttp {

    /**
     ******************************************************************************************************************
     *<-----------------------------------------以下为Get方式获取信息的API接口--------------------------------------->
     *******************************************************************************************************************
     */

    /**
     * 获取用户信息
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @return 返回用户信息
     */
    ApiResponse<UserInfo> getUserInfo(UserSession userSession) ;

    /**
     * 获取附近分享的热点列表
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @param areaId 用户当前所在的行政区域Id，精确到区（如深圳市宝安区是518101）
     * @param longitude 位置的经度坐标
     * @param latitude 位置的纬度坐标
     * @return 返回附近分享的热点列表
     */
    ApiResponse<List<SharedWifiInfo>> getNearbySharedWifiList(UserSession userSession, int areaId, double longitude, double latitude) ;

    /**
     * 获取用户绑定的设备
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @return 返回用户绑定的设备
     */
    ApiResponse<UserBoundDevice> getUserBoundDevice(UserSession userSession) ;

    /**
     * 获取用户套餐状况
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @return 返回用户套餐状况
     */
    ApiResponse<UserPackageSituation> getUserPackageSituation(UserSession userSession) ;

    /**
     * 获取我分享的Wifi列表
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @return 返回我分享的Wifi列表
     */
    ApiResponse<List<SharedWifiInfo>> getMySharedWifiList(UserSession userSession) ;

    /**
     * 获取指定Wifi的基本信息
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @param wifiId 需要查询的wifi的Id
     * @return 返回指定Wifi的基本信息
     */
    ApiResponse<SharedWifiInfo> getSharedWifiInfo(UserSession userSession, int wifiId);

    /**
     * 获取我分享的所有Wifi的收益列表
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @return 返回我分享的所有Wifi的收益列表
     */
    ApiResponse<List<MySharedWifiProfit>> getMyAllSharedWifiProfitList(UserSession userSession) ;

    /**
     * 获取我分享的指定Wifi的收益列表
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @param wifiId 需要查询的wifi的Id
     * @return 我分享的指定Wifi的收益列表
     */
    ApiResponse<List<WifiMonthProfit>> getMySpecifyWifiProfitList(UserSession userSession, int wifiId);

    /**
     * 获取我的支付列表
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @return 返回我的支付列表
     */
    ApiResponse<List<PaidRecord>> getMyPaidList(UserSession userSession) ;

    /**
     * 获取套餐列表
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @return 返回套餐列表
     */
    ApiResponse<List<UserPackageInfo>> getPackageInfoList(UserSession userSession) ;

    /**
     * 获取绑定的银行卡列表
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @return 返回绑定的银行卡列表
     */
    ApiResponse<List<BoundBankCard>> getMyBoundBankCardList(UserSession userSession) ;

    /**
     * 获取APP 版本信息
     * @param appPlatform 当前平台编号，1为Android ， 2为IOS
     * @return 返回APP 版本信息
     */
    ApiResponse<AppVersionInfo> getAppVersion(int appPlatform) ;

    /**
     * 通过地址获取行政区域
     * @param userSession
     * @param country
     * @param province
     * @param city
     * @param district
     * @return
     */
    ApiResponse<AreaInfo> getAreaIdByAddress(UserSession userSession, String country, String province, String city, String district);

    /**
     *******************************************************************************************************************
     *<-----------------------------------------以下为Post方式提交信息的API接口--------------------------------------->
     ********************************************************************************************************************
     */

    /**
     * 用户提交手机做注册验证
     * @param mobilePhone （不能为空）用户注册用的手机号，提交时该值为手机号的BASE64编码
     * @return
     */
    ApiResponse<Void> postPhoneToRegisterVerify(String mobilePhone) ;

    /**
     * 提交用户注册信息
     * @param userName 昵称，提交时进行BASE64编码
     * @param userPassword 密码，提交时进行MD5加密
     * @param userPhone 接收验证码的手机号，该手机号是发送验证码时向服务器提交的手机号（不能在提交时从输入框获取防止用户修改），提交时需要对手机进行BASE64编码
     * @param verifyCode 验证码
     * @return UserSession
     */
    ApiResponse<UserSession> postUserRegister(String userName, String userPassword, String userPhone, String verifyCode) ;

    /**
     * 用户登录
     * @param userAccount 帐号，目前只允许手机号登录，提交时进行BASE64编码
     * @param userPassword 密码，提交时进行MD5加密
     * @return UserSession
     */
    ApiResponse<UserSession> postUserLogin(String userAccount, String userPassword) ;

    /**
     * 用户修改密码前做身份验证（找回密码，修改密码）
     * @param userPhone 用户注册用的手机号登录，提交时进行BASE64编码
     * @return
     */
    ApiResponse<Void> postPhoneToModifyPassword(ModifyPwdType typeTag, String userPhone) ;

    /**
     * 用户修改密码前做身份验证，发送手机收到的验证码
     * @param userPhone 用户注册用的手机号登录，提交时进行BASE64编码
     * @param verifyCode 手机收到的验证码
     * @return UserToken 身份验证成功后返回的修改密码可操作令牌，修改密码时需携带该令牌做验证
     */
    ApiResponse<UserToken> postVerifyCodeToModifyPassword(ModifyPwdType typeTag, String userPhone, String verifyCode) ;

    /**
     * 用户重置登录密码
     * @param userId 通过身份验证后的用户Id
     * @param userPassword 用户要求重置的新密码，提交时MD5加密
     * @param token 通过手机验证后取得的电子令牌
     * @return
     */
    ApiResponse<Void> postNewPasswordToModifyLoginPassword(int userId, String userPassword, String token) ;

    /**
     * 用户绑定设备
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @param deviceMac 用户购买的设备的Mac地址的MD5加密值
     * @return 设备唯一编号
     */
    ApiResponse<ResponsedDevice> postBindDevice(UserSession userSession, String deviceMac) ;

    /**
     * 解绑设备
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @param deviceId 用户购买的设备的唯一Id（一期只允许用户绑定一个设备，该值可以不使用）
     * @return
     */
    ApiResponse<Void> postUnbindDevice(UserSession userSession, int deviceId) ;

    /**
     * 增加分享的Wifi
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @param wifiSSID wifiSSID的BASE64编码
     * @param wifiPassword wifi密码的BASE64编码
     * @param wifiMac wifiMac地址的MD5值
     * @param wifiLongitude wifi的位置经度坐标
     * @param wifiLatitude wifi的位置纬度坐标
     * @param wifiAreaId wifi位置所在行政区域的区域编号
     * @param wifiAddress wifi位置所在行政区域
     * @return
     */
    ApiResponse<Void> postAddWifi(UserSession userSession, String wifiSSID, String wifiPassword, String wifiMac,
                                  double wifiLongitude, double wifiLatitude, int wifiAreaId, String wifiAddress) ;

    /**
     * 删除分享的Wifi
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @param wifiId 需要删除的wifi的Id
     * @return
     */
    ApiResponse<Void> postDeleteWifi(UserSession userSession, int wifiId) ;

    /**
     * 更新分享的Wifi
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @param wifiId 需要更新的wifi的Id
     * @param wifiSSID wifiSSID的BASE64编码
     * @param wifiPassword wifi密码的BASE64编码
     * @param wifiLongitude wifi的位置经度坐标
     * @param wifiLatitude wifi的位置纬度坐标
     * @param wifiAreaId wifi位置所在行政区域的区域编号
     * @param wifiAddress wifi位置所在行政区域
     * @return
     */
    ApiResponse<Void> postUpdateWifi(UserSession userSession, int wifiId, String wifiSSID, String wifiPassword,
                                     double wifiLongitude, double wifiLatitude, int wifiAreaId, String wifiAddress) ;

    /**
     * 重置支付密码
     * @param userId 通过身份验证后的用户Id
     * @param userPassword 用户要求重置的新密码，提交时MD5加密
     * @param token 通过手机验证后取得的电子令牌
     * @return
     */
    ApiResponse<Void> postNewPasswordToModifyPayPassword(int userId, String userPassword, String token) ;

    /**
     * 购买用网套餐，支付成功后向服务器提交
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @param packageType 购买的套餐类型
     * @param count 购买的套餐数量
     * @param totalPrice 支付的总金额
     * @return
     */
    ApiResponse<Void> postBuyPackage(UserSession userSession, int packageType, int count, float totalPrice) ;

    /**
     * 获取银行卡类型
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @param accountNum 银行卡号的BASE64编码
     * @return BankType 账号所属银行
     */
    ApiResponse<BankType> postBindBankCardForBankType(UserSession userSession, String accountNum) ;

    /**
     * 提交银行卡号验证银行卡持卡人身份信息
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @param cardholderName 持卡人姓名的BASE64编码
     * @param cardholderPhone 持卡人手机号的BASE64编码
     * @param accountNum 银行卡号的BASE64编码
     * @param bankType 银行类型
     * @return
     */
    ApiResponse<Void> postBindBankCardToVerifyIdentity(UserSession userSession, String cardholderName,
                                                       String cardholderPhone, String accountNum, int bankType) ;

    /**
     * 提交银行卡号获取验证码
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @param cardholderPhone 持卡人手机号的BASE64编码
     * @param accountNum 银行卡号的BASE64编码
     * @return ResponsedToken 权限令牌
     */
    ApiResponse<ResponsedToken> postBindBankCardForVerifyCode(UserSession userSession, String cardholderPhone, String accountNum) ;

    /**
     * 提交验证码绑定银行卡
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @param cardholderPhone 持卡人手机号的BASE64编码
     * @param accountNum 银行卡号的BASE64编码
     * @param token 验证通过后的令牌
     * @return
     */
    ApiResponse<Void> postBindBankCardWithVerifyCode(UserSession userSession, String cardholderPhone, String accountNum, String token) ;

    /**
     * 获取解绑银行卡身份验证
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @param payPassword 支付密码的MD5值
     * @return ResponsedToken 权限令牌
     */
    ApiResponse<ResponsedToken> postUnbindBankCardForVerify(UserSession userSession, String payPassword) ;

    /**
     * 解绑银行卡
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @param accountNum 银行卡号的BASE64编码
     * @param token 验证通过后的令牌
     * @return
     */
    ApiResponse<Void> postUnbindBankCard(UserSession userSession, String accountNum, String token) ;

    /**
     * 设置默认提现银行卡
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @param accountNum 银行卡号的BASE64编码
     * @return
     */
    ApiResponse<Void> postSetDefaultBankCard(UserSession userSession, String accountNum) ;

    /**
     * 提现余额到银行卡
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @param accountNum 银行卡号的BASE64编码
     * @param outMoney 提现金额
     * @return
     */
    ApiResponse<Void> postOutMoney(UserSession userSession, String accountNum, float outMoney) ;

    /**
     * 修改用户昵称
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @param userName 用户昵称的BASE64编码
     * @return
     */
    ApiResponse<Void> postModifyUserName(UserSession userSession, String userName) ;

    /**
     * 提交用户反馈
     * @param userSession 用户会话，包含用户ID及登录成功的会话密钥
     * @param appPlatform 平台号1：Android       2：IOS
     * @param appVersionCode App版本号
     * @param feedbackContent 用户反馈的内容
     * @param time 提交时的unix时间戳
     * @return
     */
    ApiResponse<Void> postUserFeedback(UserSession userSession, int appPlatform, int appVersionCode, String feedbackContent, long time) ;
}
